package _7_集合._6_Collections;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsTest {

    /**
     * 创建单元素集合
     */

    //Collections提供了一系列方法来创建一个单元素集合,返回的单元素集合也是不可变集合，无法向其中添加或删除元素
    //使用List.of(T...)更方便，因为它既可以创建空集合，也可以创建单元素集合，还可以创建任意个元素的集合

//    @Test
//    public void ListOfTest(){
//        List<String> list = Collections.singletonList("apple");
//        List<String> list0 = List.of();                           //需要Java9
//        List<String> list1 = List.of("apple");
//        List<String> list2 = List.of("apple","pear");
//        List<String> list3 = List.of("apple","pear","banana");
//    }

    /**
     * 排序
     */

    //Collections可以对List进行排序。因为排序会直接修改List元素的位置，因此必须传入可变List
    @Test
    public void collectionsSortTest(){
        List<String> list = new ArrayList<>();
        list.add("pear");
        list.add("orange");
        list.add("apple");
        System.out.println("排序前：" + list);
        //Collections可以对List进行排序。因为排序会直接修改List元素的位置，因此必须传入可变List
        Collections.sort(list);
        System.out.println("排序后：" + list);
    }

    /**
     * 洗牌
     */

    //Collections提供了洗牌算法，即传入一个有序的List，可以随机打乱List内部元素的顺序，效果相当于让计算机洗牌
    @Test
    public void collectionsShuffleTest(){
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 13; i++){
            list.add(i);
        }
        System.out.println("洗牌前：" + list);
        Collections.shuffle(list);
        System.out.println("洗牌后：" + list);
    }

    /**
     * 不可变集合
     */

    //Collections还提供了一组方法把可变集合封装成不可变集合
    //这种封装实际上是通过创建一个代理对象，拦截掉所有修改方法实现的。
    @Test
    public void collectionsUnmodifiableTest1(){
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("pear");
        // 变为不可变集合:
        List<String> unmodifiableList = Collections.unmodifiableList(list);
        unmodifiableList.add("banana");// UnsupportedOperationException

    }

    //继续对原始的可变List进行增删是可以的，并且，会直接影响到封装后的“不可变”List：
    @Test
    public void collectionUnmodifiableTest2(){
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("pear");
        // 变为不可变集合:
        List<String> unmodifiableList = Collections.unmodifiableList(list);
        list.add("banana");
        System.out.println(unmodifiableList);
    }

    @Test
    public void collectionUnmodifiableTest3(){
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("pear");
        // 变为不可变集合:
        List<String> unmodifiableList = Collections.unmodifiableList(list);
        // 立刻扔掉list的引用:
        list = null;
        System.out.println(unmodifiableList);
    }




}